Kafka - KRaft
contents
KRaft(Kafka Raft Metadata mode) 는 카프카의 메타데이터 관리를 위해 기존의 아파치 주키퍼(Apache ZooKeeper)를 대체하는 내장 메커니즘입니다.
KRaft는 Raft 합의 프로토콜을 사용하여 토픽 설정, 브로커 목록, 파티션 리더십과 같은 모든 클러스터 메타데이터를 관리함으로써, 카프카가 단일, 독립형 분산 시스템으로 작동할 수 있게 합니다.
이 변화는 카프카 역사상 가장 중대한 아키텍처 변화로, 운영 단순화, 확장성 향상, 시스템 복원력 증대를 목표로 합니다.
주키퍼를 대체하는 이유: 기존의 문제점
카프카는 오랫동안 클러스터 상태를 관리하기 위해 아파치 주키퍼라는 별개의 분산 시스템에 의존해 왔습니다. 이로 인해 몇 가지 주요한 문제점이 발생했습니다.
- 운영 부담: 카프카 하나를 실행하기 위해 두 개의 복잡한 분산 시스템(카프카와 주키퍼)을 배포, 설정, 보안, 모니터링, 관리해야 했습니다.
- 확장성 병목: 카프카가 아닌 주키퍼가 확장성의 한계점이 되는 경우가 많았습니다. 메타데이터 업데이트가 주키퍼를 통해 집중되면서, 클러스터의 실질적인 파티션 수가 수십만 개로 제한되었습니다.
- 느린 장애 복구: 활성 카프카 컨트롤러(주키퍼를 통해 선출된 브로커)가 실패했을 때, 주키퍼가 실패를 감지하고 새 컨트롤러가 선출되어 모든 상태를 로드하는 데 시간이 걸렸습니다. 이로 인해 클러스터 전체가 몇 초간 다운될 수 있었습니다.
KRaft의 작동 원리 ⚙️
KRaft는 모든 메타데이터 관리를 카프카 자체 내부 로 이동시켜 이러한 문제들을 해결합니다. 이는 컨트롤러 쿼럼(Controller Quorum) 과 메타데이터 로그(Metadata Log) 라는 두 가지 핵심 구성 요소를 통해 달성됩니다.
1. 컨트롤러 쿼럼과 Raft
모든 브로커가 주키퍼에 연결하는 대신, 소수의 고정된 브로커(예: 3개 또는 5개)가 설정 파일에서 컨트롤러로 지정됩니다. 이 컨트롤러 노드들은 Raft 쿼럼을 형성합니다.
- Raft 합의: 이 쿼럼은 Raft 합의 프로토콜을 사용하여 자신들 중에서 리더(즉, 활성 컨트롤러)를 선출하고 모든 메타데이터 변경 사항을 안정적으로 복제합니다.
- 활성 컨트롤러: 쿼럼 내의 컨트롤러 중 하나만 활성 상태가 됩니다. 이 컨트롤러는 토픽 생성이나 브로커 장애 처리와 같은 클러스터 상태의 모든 변경을 담당합니다.
- 대기 컨트롤러: 쿼럼의 다른 컨트롤러들은 팔로워(follower)입니다. 이들은 활성 컨트롤러로부터 메타데이터를 지속적으로 복제하며, 리더 장애 시 거의 즉시 인계받을 준비가 되어 있습니다.
2. 메타데이터 로그 (__cluster_metadata)
이것이 가장 중요한 부분입니다. 모든 클러스터 메타데이터는 더 이상 주키퍼의 트리형 데이터 구조에 저장되지 않습니다. 대신, 클러스터 내부의 __cluster_metadata 라는 특별하고 복제율이 높은 카프카 토픽에 저장됩니다.
- 이 토픽은 클러스터에서 발생하는 모든 변경 사항(예: 'A 토픽 생성됨', '파티션 2의 리더는 이제 브로커 5임')에 대한 추가 전용(append-only) 순서 로그 역할을 합니다.
- 활성 컨트롤러가 이 토픽의 유일한 프로듀서입니다.
- 대기 컨트롤러는 이 토픽의 컨슈머 로서, 자신들의 상태가 완벽하게 동기화되도록 보장합니다.
- 컨트롤러가 아닌 다른 모든 브로커들도 이 토픽을 소비하여 클러스터의 최신 상태를 유지합니다.
브로커가 특정 파티션의 리더가 누구인지 알아야 할 때, 단순히 이 로그를 소비하여 구축한 자신의 로컬 인메모리 메타데이터 상태 복사본을 조회합니다.
KRaft의 주요 이점
1. 단순성 😌
이것이 첫 번째 이점입니다. 관리해야 할 서비스가 하나뿐입니다.
- 더 이상 주키퍼 JVM, 보안 규칙, 설정이 필요 없습니다.
- 배포, 모니터링, 보안이 모두 카프카 내에서 통합 관리됩니다.
2. 대규모 확장성 📈
KRaft는 주키퍼의 병목 현상을 제거합니다. 메타데이터를 단순한 카프카 로그로 관리함으로써, KRaft 기반 클러스터는 주키퍼 기반의 한계보다 10배 이상 증가한 수백만 개의 파티션을 지원할 수 있습니다.
3. 더 빠른 장애 복구 및 시작 ⚡
- 장애 복구: 활성 컨트롤러가 실패하면, Raft 쿼럼은 대기 노드 중에서 몇 초가 아닌 밀리초 단위로 새 리더를 선출할 수 있습니다. 이는 컨트롤러 장애로 인한 클러스터 다운타임을 거의 제거합니다.
- 시작: KRaft 클러스터는 별도의 쿼럼(주키퍼)이 먼저 준비될 때까지 기다릴 필요가 없기 때문에 훨씬 더 빨리 시작하고 안정화될 수 있습니다.
KRaft 현황
- 운영 환경 사용 가능: KRaft는 아파치 카프카 3.3 버전부터 운영 환경(Production Ready)에서 사용할 수 있게 되었습니다.
- 기본값: 이제 모든 새로운 카프카 배포에 기본(default)이자 권장 모드입니다.
- 주키퍼 지원 종료: 주키퍼 모드는 카프카 4.0에서 사용 중단(deprecated)되었으며, 향후 릴리스에서 완전히 제거될 예정입니다.
references